DOSKEY
이 명령어는 DOSKEY 프로그램을 메모리에 탑재하기 위하여 사용하는 것으로 이미 사용되었던 도스 명령어를 재호출하거나 재호출된 명령어를 편집할 수 있고, 매크로를 만들 수 있다.
따라서, DOSKEY의 매크로 작성 기능을 이용하면 사용자의 용도에 맞게 작업을 자동화 할 수 있다.
DOSKEY 프로그램은 메모리 상주 프로그램으로 일단 메모리에 탑재되면 항상 메모리에 상주하는데, 한번 설치되는데 약 3KB 정도의 메모리가 사용된다.
그러나, 일단 메모리에 상주한 뒤에는 다시 DOSKEY 명령어를 사용하여도 메모리 공간을 더 차지하는 것은 아니다. 이것은 매크로를 정의하기 위하여 DOSKEY 명령어를 자주 사용할 필요가 있는 경우가 자주 발생하기 때문이다.
예를 들어, 10개의 매크로를 정의하기 위해서는 10번의 DOSKEY 명령어를 사용하는데, 매번 DOSKEY가 메모리에 상주하는 것이 아니라 두 번째부터 사용되는 경우에는 필요한 매크로 정의만 수용하는 것이다.
■ 명령어 위치
윈도우가 설치되어 있는 하드디스크(C:\Windows\Command)에 실행 파일 형태로 존재하는 외부 명령어
■ 사용법
DOSKEY [/BUFSIZE=size] [/ECHO:on|off] [/FILE:filename] [/HISTORY]
[/INSERT|/OVERSTRIKE] [/KEYSIZE:size] [/LINE:size] [/MACROS]
[/REINSTALL] [macroname=[command]]
■ 옵션 및 매개변수

/bufsize=size | DOSKEY가 명령어와 DOSKEY 매크로를 저장하는 버퍼의 크기를 바이트 단위로 지정한다. 디폴트는 512바이트이고, 최소 버퍼 크기는 256바이트이다.
/echo:on|off | 매크로 확장의 화면 표시를 활성화 하거나(on) 비활성화(off>한다. 기본값은 on이다.
/FILE:filename | 매크로 목록이 포함된 파일 이름을 지정한다.
/history | /bufsize 옵션을 사용하여 지정된 메모리에 저장되어 있는 모든 명령어를 보여줍니다. 화면에 표시하는 대신 명령어 목록을 텍스트 파일로 저장하기 위해 방향 전환 기호(>)를 사용할 수 있다. /history 옵션은 /h로 줄여서 사용할 수 있다.
/insert|/overstrike | 비슷한 명령어를 편집하는 경우에 키보드로부터 입력된 명령어가 기존의 명령어 사이에 삽입될 것인가 아니면 대체할 것인가를 지정한다. /insert 옵션을 지정하면 기존의 명령어에 삽입되는 방식으로 입력되고, /overstrike 옵션은 기존의 명령어를 대체한다. 기존의 명령어 편집을 위하여 특별히 지정하지 않은 경우에는 디폴트 값으로 /overstrike가 사용된다.
/keysize:size | 입력 버퍼의 크기를 바이트 단위로 지정한다. 기본값은 15바이트이다.
/line:size | 행 편집 버퍼의 최대 크기를 바이트 단위로 지정한다. 기본값은 128바이트이다.
/macros | 모든 DOSKEY 매크로의 목록을 보여준다. 화면에 매크로 목록을 표시하는 대신 텍스트 파일로 저장할 수 있는데, 이 경우 방향 전환 기호(>)를 사용한다. /macros 옵션은 /m으로 줄여서 사용할 수 있다.
/reinstall | DOSKEY가 이미 설치되어 있을지라도, DOSKEY 프로그램을 새로 설치한다. 이 경우 /reinstall 옵션은 현재까지 버퍼에 저장되어 있는 모든 명령어를 지운다.
macroname=[command] | 텍스트 문자열에 의해 지정된 명령어를 수행하는 매크로를 만든다. macroname은 사용자가 임의로 지정할 수 있다. command에는 사용자가 기록하고 싶은 명령어를 지정한다. 만약 command 대신 아무 것도 입력하지 않으면 macroname에 할당된 명령어를 지운다.

■ 참고 사항
☞ 이미 사용했던 명령어를 재호출하기
이미 사용한 적이 있는 명령어를 재호출하려면 DOSKEY를 메모리에 탑재한 후 다음 키들을 사용할 수 있다.

<↑> | 현재 명령어 라인에 나타난 명령어 전에 사용한 명령어를 재호출한다.
<↓> | 현재 명령어 라인에 나타난 명령어 뒤에 사용한 명령어를 재호출한다.
<PgUp> | 현행 작업 중 사용되었던 명령어 중에서 가장 오래된 명령어를 재호출한다.
<PgDn> | 현행 작업 중 사용되었던 명령어 중에서 가장 최근의 명령어를 재호출한다.

☞ 명령어 라인 편집하기
DOSKEY 프로그램을 이용하여 현행 명령어 라인을 편집할 수 있다. 이처럼 명령어 라인을 편집할 수 있게 됨으로써 동일하거나 비슷한 내용의 명령어를 키보드로부터 처음부터 재입력할 필요가 없다.
다음은 DOSKEY에서 명령어를 편집할 때 사용할 수 있는 편집 키와 그 기능에 대한 설명이다.

<→> | 커서를 한 문자 뒤로 이동한다.
<←> | 커서를 한 문자 앞으로 이동한다.
<Ctrl+→> | 커서를 한 단어 뒤로 이동한다.
<Ctrl+←> | 커서를 한 단어 앞으로 이동한다.
<Home> | 커서를 현행 명령어 라인의 맨 앞으로 이동한다.
<End> | 커서를 현행 명령어 라인의 맨 뒤로 이동한다.
<Esc> | 명령어 줄에 나타난 명령어를 제거한다.
<F1> | 템플리트에서 한 문자를 명령어 라인으로 복사한다. 템플리트(template)는 사용자가 마지막으로 입력한 명령어를 기억하고 있는 메모리 버퍼를 의미한다.
<F2> | <F2> 키를 누른 다음 사용자가 입력한 다음 키에 대하여 템플리트에서 찾는다. 즉, DOSKEY는 템플리트에서 <F2>를 누른 다음에 입력한 문자를 찾아 그 이전에 있는 문자까지(지정한 문자는 포함하지 않고) 현행 명령어 라인에 삽입한다.
<F3> | 템플리트의 나머지를 현행 명령어 라인에 복사한다. DOSKEY는 명령어 라인에서 커서에 의해 지정된 위치에 상응하는 템플리트 내의 위치로부터 문자를 복사한다.
<F4> | 이 키는 <F2>와는 반대로 기능한다. 즉, 템플리트의 첫 문자에서 사용자가 지정한 문자까지를 삭제한다. 이 편집 키를 사용하려면 먼저 <F4> 키를 누르고 문자를 입력한다. DOSKEY는 지정된 문자 바로 앞까지를 지운다. 이 기능 키의 사용은 화면에 나타나지 않는다. 확인하려면 템플리트의 문자를 복사하는 <F1>이나 <F3>을 이용한다.
<F5> | 현행 명령어를 템플리트로 복사하고, 명령어 라인을 소거한다.
<F6> | EOF(Ctrl+Z) 문자를 현행 커서의 위치에 놓는다.
<F7> | 메모리에 저장된 모든 명령어를 보여준다. 사용자는 원하는 명령어를 선택하기 위하여 상하 화살표 키를 이용하여 선택한 후, <Enter>를 누르면 선택한 명령어가 실행된다. 사용자는 또한 명령어 앞에 있는 연속되는 숫자들을 이용하여 <F9> 키와 조합하여 사용할 수 있다.
<Alt+F7> | 메모리에 저장된 모든 명령어를 삭제한다. 이 기능 키는 /reinstall 옵션을 사용하는 것과 같은 효과를 갖는다.
<F8> | 화면에 입력된 명령어와 일치되는 명령어 라인을 메모리에서 검색하여 표시한다. 먼저 검색하려는 명령의 첫 부분을 입력한 후 <F8> 키를 누르면 입력한 명령과 일치하는 첫 번째 명령어 줄이 나타난다. 키를 연속해서 누르면 지정한 문자로 시작되는 모든 명령이 연속적으로 나타난다.
<F9> | 사용되었던 명령어에 일련 번호가 부여되어 있는데, 이 번호를 알고 있다면 <F9>를 누른 다음, 실행하고자 하는 명령어 라인의 일련 번호를 입력하고 <Enter>를 누르면 해당 명령어가 나타난다. 이 명령어를 실행하고자 하면 <Enter>를 누르면 된다. 명령어 라인의 일련 번호를 알고자 한다면 <F7> 키를 누른다.
<Alt+F10> | 모든 매크로 정의를 삭제한다.

☞ 명령어 라인 편집시 삽입 모드 지정하기
사용자가 화면에 나타난 명령어를 편집하는 경우 <Insert> 키를 누르면 기존의 명령어를 덮어쓰지 않고 삽입된다. 그러나 이 경우 일단 하나의 명령어가 실행된 후에는 다시 수정 모드로 돌아간다. 삽입 모드에서 명령어를 편집하고자 하려면 매번 <Insert> 키를 눌러 주어야 한다.
이러한 불편함을 덜기 위하여 제공되는 옵션이 /insert 옵션이다. /insert 옵션을 지정하는 경우 사용자가 <Enter>를 눌러 명령어를 실행할 때마다 키보드를 삽입 모드로 변환시킨다. 만약, 삽입 모드에서 수정 모드로 변환하려면 /overstrike 옵션을 사용하여 DOSKEY를 재설치한다. 일시적으로 수정 모드로 변환하려면 <Insert> 키를 누른다.
DOSKEY는 삽입 모드와 수정 모드를 구분하기 위하여 입력 모드에 따라 커서의 모양을 바뀐다.
☞ 매크로 만들기
사용자는 하나나 그 이상의 프롬프트 명령어를 실행하는 매크로를 만들기 위하여 DOSKEY 명령어를 사용할 수 있다. 매크로를 만들기 위하여 배치 프로그램 내에서도 DOSKEY 명령어를 사용할 수 있다.
사용자는 매크로를 정의할 때 매크로 명령어 구동을 위하여 다음과 같은 특별한 문자를 사용할 수 있다.

$G 또는 $g | 출력 방향을 전환한다. 즉, 출력을 스크린 대신에 프린터와 같은 주변장치나 파일로 보내기 위해서 이 문자를 사용한다. 이 특별 문자는 "출력을 위한 방향 전환 기호(>)"와 같은 의미이다.
$G$G 또는 $g$g | 출력을 스크린 대신에 파일로 보내는데, 이 특별 문자는 기존에 있는 파일의 마지막에 추가하도록 하는 경우에 사용한다. 즉, 기존에 있는 파일을 지정하고 $g 문자를 사용하는 경우에는 기존의 데이터를 전부 삭제하는데 반하여 $g$g 문자는 기존의 파일 뒤에 추가한다는 점에서 차이가 있다. 이중 문자는 "출력을 위한 추가된 방향 전환 기호(>>)"와 같은 의미로 사용된다.
$L 또는 $l | 입력을 방향 전환하는 경우에 이 문자를 사용한다. 즉, 키보드 대신에 주변장치나 파일로부터 입력을 읽도록 하는 경우에 사용한다. 이 문자는 "입력을 위한 방향 전환 기호(<)"와 같은 의미로 사용된다.
$B 또는 $b | 매크로의 출력을 명령어로 보낸다. 이 특별 문자는 명령어 라인에서 파이프(|)를 사용하는 것과 같은 의미로 사용된다.
$T 또는 $t | 명령어를 분리하는데 사용된다. 즉, 매크로를 만들거나 DOSKEY 명령어 라인에서 명령어를 입력할 때 각각의 명령어를 분리하는 효과를 나타낸다.
$$ | 달러 표시($) 문자를 지정한다.
$1 ∼ $9 | 사용자가 매크로를 실행할 때, 지정하고자 하는 모든 명령어 정보를 나타낸다. $1부터 $9까지의 특별 문자들은 배치 매개변수이고, 이 변수는 매크로를 사용할 때마다 명령어 라인에 있는 다른 데이터를 사용할 수 있도록 한다. DOSKEY에서의 $1 문자는 배치 프로그램에서의 %1 문자와 같은 것이다.
$* | 사용자가 매크로를 실행하기 위하여 매크로 이름으로 지정하고 싶은 모든 명령어 라인 정보를 나타낸다. $*는 한가지 중요한 차이점을 제외하고는 $1부터 $9까지의 배치 매개변수와 유사한 것으로 변경할 수 있는 매개변수를 의미한다.

다음의 매크로 이름 뒤에 사용자가 입력한 명령어 라인 상의 모든 옵션이나 정보가 매크로 내에서 $*로 대체된다. 예를 들어, 5.25인치 2D 디스크의 빠른 포맷을 수행하는 매크로를 만들고자 한다면 다음과 같이 명령어를 입력한다.
doskey qf=format $1 /q/4
위의 예에서 /q/4 옵션은 $*로 대표된다.
☞ 매크로 실행하기
매크로를 실행하기 위하여 명령어 라인 상의 첫 번째 자리에 시작하는 매크로 이름을 입력한다.
만약 매크로가 $* 혹은 $1부터 $9 사이의 배치 매개변수 중에서 둘 이상의 매개변수가 연속적으로 정의되어 있다면 매개변수를 분리하기 위해 스페이스를 사용한다.
위의 예에서 지정한 'doskey qf=format $1 /q/4' 매크로를 A드라이브를 포맷하기 위하여 다음과 같이 입력함으로써 매크로를 실행할 수 있다.
qf a:
매크로의 정의는 배치 프로그램 내에서 실행할 수는 있지만, 매크로의 실행은 배치 프로그램 내에서 실행할 수 없다.
☞ 도스 명령어와 같은 이름을 가진 매크로 만들기
도스의 실행 가능한 프로그램의 이름과 같은 매크로를 만들 수 있다.
즉, 디스크를 포맷하는 프로그램의 이름은 FORMAT.EXE인데 format이라는 이름을 가진 매크로를 만들 수 있는 것이다.
이처럼 동일한 이름으로 매크로를 만드는 것은 프로그램을 실행할 때마다 동일한 옵션을 지정하고자 하는 경우에 사용된다.
이처럼 동일한 이름을 가진 매크로를 정의할 수 있지만, 도스 명령어 라인에서 입력하는 방식에 따라 매크로가 실행될 수 있고 명령어가 실행될 수 있다. 즉, 매크로를 실행할 때 스페이스의 여부에 따라 매크로가 실행될 수 있고, 명령어가 직접 실행될 수 있다.
매크로를 실행하려면, 프롬프트 다음에 스페이스를 두지 않고 직접 매크로 이름을 입력한다. 만약, 도스 명령어를 실행하려면 명령어 프롬프트 다음에 하나 이상의 스페이스를 삽입한 후에 명령어를 입력한다.
다음의 예는 동일한 이름을 가진 명령어와 매크로를 실행하는 방법이다. 단, 매크로는 'doskey dir=dir $1 /s/b/o:en'으로 지정되어 있다고 가정하고, 현행 드라이브는 C드라이브의 루트 디렉토리라고 가정한다.
매크로의 실행 C:\>dir *.*
명령어의 실행 C:\> dir *.*
☞ 매크로 삭제하기
이미 지정되어 있는 매크로를 삭제할 수 있다.
매크로를 삭제하려면 다음과 같이 DOSKEY 명령어를 입력한다. 단, 삭제하고자 하는 매크로 이름은 abcde라고 가정한다.
doskey abcde=
■ 사용 예
/macros(혹은 /m) 옵션과 /history(혹은 /h) 옵션은 매크로와 명령어를 저장하기 위한 배치 프로그램을 만드는데 유용한 옵션이다.
만약, 모든 매크로를 포함한 DOSKEY 명령어를 MAKEINIT.BAT라는 배치 프로그램을 만들고자 한다면 다음과 같이 DOSKEY 명령어를 사용할 수 있다.
doskey /m > makeinit.bat
위의 예에서 만들어진 MAKEINIT.BAT 파일을 사용하기 위해서는 각 매크로 라인의 처음에 DOSKEY 명령어를 포함하도록 편집한다.
최근에 사용된 명령어를 포함하는 TMP.BAT라는 배치 프로그램을 만들고자 한다면 다음과 같이 DOSKEY 명령어를 사용한다.
doskey /h > tmp.bat
매크로를 정의하는데 있어 여러 개의 명령어로 이루어진 매크로를 정의하려면 각각의 명령어 사이를 $t를 이용하여 분리한다.
다음의 예는 현행 디렉토리를 사용자가 지정한 디렉토리로 변경하고, 해당 디렉토리에 있는 TXT 확장자를 갖는 파일 중에서 읽기 전용 속성을 가진 파일만 사용자가 지정하는 드라이브의 디렉토리로 복사하라는 명령어를 조합하여 TX라는 매크로를 정의한 것이다.
doskey tx=cd $1 $t copy *.txt $2 /a:r
위의 예에서 $1과 $2는 사용자가 TX 매크로를 실행할 때 지정한 원본 디렉토리와 목적지 디렉토리를 의미하고, $t는 CD와 COPY 명령어를 분리하기 위한 분리 문자이다. /a:r은 읽기 전용 속성을 가진 파일만 복사하라는 옵션으로 DOSKEY 매크로에서 $*에 해당한다.
이렇게 만들어진 매크로는 사용자가 다음과 같은 형식으로 TX 매크로를 실행할 수 있다.
tx c:\edit\data a:
위의 명령어는 C:\EDIT\DATA 디렉토리에 있는 TXT 확장자를 갖는 파일 중에서 읽기 전용 속성을 가진 파일만 A드라이브로 복사하라는 것이다.
다음 매크로는 사용자가 지정한 새로운 서브디렉토리를 만들고 새로 만든 디렉토리를 현행 디렉토리로 변경하라는 MC라는 매크로를 정의한 것이다.
doskey mc=md $1 $t cd $1
위의 예에서 SPECIAL이라는 서브디렉토리를 만들어서 그 디렉토리로 변경하려면 다음과 같이 사용할 수 있다.
mc special
파일이나 일련의 파일을 이동하기 위하여 배치 매개변수를 사용하는 매크로를 만들 수도 있다.
즉, 파일의 이동은 일단 파일을 목적지 드라이브나 디렉토리로 복사한 다음, 원본 드라이브나 디렉토리에서 복사한 파일을 삭제하는 것이므로, 다음과 같이 MV 매크로를 정의할 수 있다.
doskey mv=copy $1 $2 $t del $1
위의 예에서 $1은 원본 드라이브나 디렉토리를 의미하고, $2는 목적지 드라이브나 디렉토리를 의미한다. DIR 명령어를 이용하여 파일 목록을 화면에 디스플레이하는 대신에 사용자가 지정한 파일로 출력하려면 다음과 같이 $g를 이용하여 매크로를 정의할 수 있다.
doskey dirtxt=dir $1 $g $2
위의 DIRTXT 매크로를 이용하여 현행 디렉토리 상에 있는 EXE 확장자를 갖는 모든 파일을 DIREXE.TXT 파일로 보내고자 하는 경우에는 다음과 같이 DIRTXT 매크로를 사용한다.
dirtxt *.exe direxe.txt
위의 DIRTXT 매크로에서 이미 파일로 존재하고 있는 경우에는 기존 파일의 내용을 모두 지우고 새로운 내용만 기록한다.
만약, 기존에 파일이 있는 경우에는 파일의 뒤에 목록을 추가하기 위하여 $g 대신에 $g$g의 이중 문자를 사용한다.